#include <string>
#include <iostream>

using namespace std;

int main()
{
    const char *cp = "Hello World!!!";      // 以空字符结束的数组
    char noNull[] = {'H', 'i'};             // 不是以空字符结束
    string s1(cp); // 拷贝 cp 中的字符直到遇到空字符；s1 == "Hello World!!!"
    string s2(noNull, 2);       // 从 noNull 拷贝两个字符；s2 == "Hi"
    string s3(noNull);          // 未定义：noNull 不是以空字符结束
    string s4(cp + 6, 5);       // 从 cp[6] 开始拷贝 5 个字符；s4 == "World"
    string s5(s1, 6, 5);        // 从 s1[6] 开始拷贝 5 个字符；s5 == "World"
    string s6(s1, 6);           // 从 s1[6] 开始拷贝，直至 s1 末尾；s6 == "World!!!"
    string s7(s1, 6, 20);       // 正确，只拷贝到 s1 末尾；s7 == "World!!!"
    string s8(s1, 16);          // 抛出一个 out_of_range 异常

    string str("hello world");
    string str2 = str.substr(0, 5);         // str2 = hello
    string str3 = str.substr(6);            // str3 = world
    string str4 = str.substr(6, 11);        // str4 = world
    string str5 = str.substr(12);           // 抛出一个 out_of_range 异常
}